﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Collections;
using Storytelling.Entidades;

namespace Storytelling.Utils
{
    public static class Enumeracao
    {
        private static IDictionary<string, string> labels;

        static Enumeracao()
        {
            labels = new Dictionary<string, string>();

            labels.Add(Virtude.Esperanca.ToString(), "Esperança");
            labels.Add(Virtude.Fe.ToString(), "Fé");
            labels.Add(Virtude.Justica.ToString(), "Justiça");
            labels.Add(Virtude.Prudencia.ToString(), "Prudência");
            labels.Add(Virtude.Temperanca.ToString(), "Temperança");

            labels.Add(Vicio.Luxuria.ToString(), "Luxúria");
            labels.Add(Vicio.Preguica.ToString(), "Preguiça");

            labels.Add(Tamanho.Crianca.ToString(), "Criança");

            labels.Add(Alcance.ArmaBranca.ToString(), "Arma Branca");
            labels.Add(Alcance.A_1_3_7.ToString(), "1/3/7");
            labels.Add(Alcance.A_2_5_10.ToString(), "2/5/10");
            labels.Add(Alcance.A_5_10_20.ToString(), "5/10/20");
            labels.Add(Alcance.A_10_20_40.ToString(), "10/20/40");
            labels.Add(Alcance.A_15_30_60.ToString(), "15/30/60");
            labels.Add(Alcance.A_20_40_80.ToString(), "20/40/80");
            labels.Add(Alcance.A_25_50_100.ToString(), "25/50/100");
            labels.Add(Alcance.A_30_60_120.ToString(), "30/60/120");
            labels.Add(Alcance.A_35_70_140.ToString(), "35/70/140");
            labels.Add(Alcance.A_40_80_160.ToString(), "40/80/160");
            labels.Add(Alcance.A_50_100_200.ToString(), "50/100/200");
            labels.Add(Alcance.A_125_250_500.ToString(), "125/250/500");
            labels.Add(Alcance.A_150_300_600.ToString(), "150/300/600");
            labels.Add(Alcance.A_175_350_700.ToString(), "175/350/700");
            labels.Add(Alcance.A_200_400_800.ToString(), "200/400/800");
            labels.Add(Alcance.A_250_500_1000.ToString(), "250/500/1000");
            labels.Add(Alcance.A_300_600_1200.ToString(), "300/600/1200");
            labels.Add(Alcance.Lancado.ToString(), "Lançado");
            labels.Add(Alcance.Lancado_3.ToString(), "Lançado*3");
            labels.Add(Alcance.Lancado_4.ToString(), "Lançado*4");

            labels.Add(Campo.Forca.ToString(), "Força");
            labels.Add(Campo.Presenca.ToString(), "Presença");
            labels.Add(Campo.Manipulacao.ToString(), "Manipulação");
            labels.Add(Campo.Inteligencia.ToString(), "Inteligência");
            labels.Add(Campo.Raciocinio.ToString(), "Raciocínio");
            labels.Add(Campo.Perseveranca.ToString(), "Perseverança");
            labels.Add(Campo.ArmasDeFogo.ToString(), "Armas de Fogo");
            labels.Add(Campo.Conducao.ToString(), "Condução");
            labels.Add(Campo.Dissimulacao.ToString(), "Dissimulação");
            labels.Add(Campo.Sobrevivencia.ToString(), "Sobrevivência");
            labels.Add(Campo.Astucia.ToString(), "Astúcia");
            labels.Add(Campo.Expressao.ToString(), "Expressão");
            labels.Add(Campo.Intimidacao.ToString(), "Intimidação");
            labels.Add(Campo.Persuasao.ToString(), "Persuasão");
            labels.Add(Campo.Socializacao.ToString(), "Socialização");
            labels.Add(Campo.TratoAnimais.ToString(), "Trato com Animais");
            labels.Add(Campo.Ciencias.ToString(), "Ciências");
            labels.Add(Campo.Erudicao.ToString(), "Erudição");
            labels.Add(Campo.Informatica.ToString(), "Informática");
            labels.Add(Campo.Investigacao.ToString(), "Investigação");
            labels.Add(Campo.Oficios.ToString(), "Ofícios");
            labels.Add(Campo.Politica.ToString(), "Política");

            labels.Add(TipoDesvantagem.Um.ToString(), "\u25CF");
            labels.Add(TipoDesvantagem.Dois.ToString(), "\u25CF\u25CF");
            labels.Add(TipoDesvantagem.Tres.ToString(), "\u25CF\u25CF\u25CF");
            labels.Add(TipoDesvantagem.Quatro.ToString(), "\u25CF\u25CF\u25CF\u25CF");
            labels.Add(TipoDesvantagem.Cinco.ToString(), "\u25CF\u25CF\u25CF\u25CF\u25CF");
            labels.Add(TipoDesvantagem.Seis.ToString(), "\u25CF\u25CF\u25CF\u25CF\u25CF\u25CF");    
        }

        public static IEnumerable<SelectListItem> Colecao<T>(int? id = null)
        {
            if (typeof(T).IsEnum)
            {
                foreach (T item in Enum.GetValues(typeof(T)))
                {
                    SelectListItem selectListItem = new SelectListItem();

                    string nome = item.ToString();
                    int valor = (int) (object) item;

                    if (id.HasValue && valor == id.Value)
                    {
                        selectListItem.Selected = true;
                    }

                    if (labels.ContainsKey(nome))
                    {
                        selectListItem.Text = labels[nome];
                    }
                    else
                    {
                        selectListItem.Text = nome;
                    }

                    selectListItem.Value = valor.ToString();
                    yield return selectListItem;
                }
            }
        }

        public static string Rotulo(object obj)
        {
            string item = obj.ToString();
            if (labels.ContainsKey(item))
            {
                return labels[item];
            }
            else
            {
                return item;
            }
        }

        public static IEnumerable<SelectListItem> Atributos
        {
            get
            {
                return Campos(true);
            }
        }

        public static IEnumerable<SelectListItem> Habilidades
        {
            get
            {
                return Campos(false);
            }
        }

        public static IEnumerable<SelectListItem> AtributosHabilidades
        {
            get
            {
                return Campos();
            }
        }

        private static IEnumerable<SelectListItem> Campos(bool? condicao = null)
        {
            foreach (Campo item in Enum.GetValues(typeof(Campo)))
            {
                int valor = (int)item;
                if (!condicao.HasValue || (condicao.Value ? valor < 9 : valor >= 9))
                {
                    SelectListItem selectListItem = new SelectListItem();

                    string nome = item.ToString();

                    if (labels.ContainsKey(nome))
                    {
                        selectListItem.Text = labels[nome];
                    }
                    else
                    {
                        selectListItem.Text = nome;
                    }

                    selectListItem.Value = valor.ToString();
                    yield return selectListItem;
                }
            }
        }

        public static IEnumerable<SelectListItem> Campos(int id, bool? condicao = null)
        {
            foreach (Campo item in Enum.GetValues(typeof(Campo)))
            {
                int valor = (int)item;
                if (!condicao.HasValue || (condicao.Value ? valor < 9 : valor >= 9))
                {
                    SelectListItem selectListItem = new SelectListItem();

                    if (valor == id)
                    {
                        selectListItem.Selected = true;
                    }

                    string nome = item.ToString();

                    if (labels.ContainsKey(nome))
                    {
                        selectListItem.Text = labels[nome];
                    }
                    else
                    {
                        selectListItem.Text = nome;
                    }

                    selectListItem.Value = valor.ToString();
                    yield return selectListItem; 
                }
            }
        }
    }
}